#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
	printf("----------------------------\n");
	printf("---------Game Start---------\n");
	printf("------------1.Play----------\n");
	printf("------------0.Exit----------\n");
	printf("---Press Enter To Confirm---\n");
	printf("----------------------------\n");
}
//void game()
//{
//	printf("Guess a number--It's between 1 and 100\n");
//	int goal = 0;
//	goal = rand() % 100 + 1;
//	int input = 0;
//	int count = 5;
//	while (count--)
//	{
//		printf("Perhaps it is:");
//		scanf("%d", &input);
//		if (input == goal)
//		{
//			printf("You Won!!!\n");
//			return;
//		}
//		else
//		{
//			if (input < goal)
//				printf("Bigger than that\n");
//			else
//				printf("Smaller than that\n");
//			printf("You have %d attempts left\n", count);
//		}
//	}
//	printf("Unswer is:%d\n", goal);
//	printf("You Lost\n");
//}
//int main()
//{
//	int op = 1;
//	srand((unsigned int)time(NULL));
//	while (op)
//	{
//		menu();
//		scanf("%d", &op);
//		if (op == 0)
//			break;
//		if (op == 1)
//			game();
//	}
//
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	char arr[] = "agasfscaewfefdaa";
//	char hide[99];
//	int left = 0;
//	int right = sizeof(arr) / sizeof(arr[0]) - 2;
//	int i = 0;
//	for (i = 0; i < right + 1; i++)
//	{
//		hide[i] = '#';
//	}
//	hide[i] = '\0';
//	printf("%s\n", hide);
//	while (left < right)
//	{
//		left++;
//		right--;
//		for (i = 0; i < left; i++)
//			printf("%c", arr[i]);
//		for (i = left; i <= right; i++)
//			printf("%c", hide[i]);
//		for (i = right+1; i < sizeof(arr)/sizeof(arr[0])-1; i++)
//			printf("%c", arr[i]);
//		printf("\n");
//	}
//	if (left == right)
//		printf("%s", arr);
//
//	return 0;
//}
//int Binary_search(int nums[], int size, int target)
//{
//	int left = 0;
//	int right = size - 1;
//	int seek = 0;
//	int middle = 0;
//	while (left <= right)
//	{
//		seek = (nums[right] - nums[left]) / 2 + nums[left];
//		middle = (left + right) / 2;
//		if (nums[middle] < target)
//			left = middle + 1;
//		if (nums[middle] > target)
//			right = middle - 1;
//		if (nums[middle] == target)
//			return middle;
//	}
//	return -1;
//	
//}
//int main()
//{
//	int nums[10] = { 1,3,5,7,9,15,17 };
//	int n = 7;
//	printf("%d", Binary_search(nums, 7, -1));
//
//	return 0;
//}
#include <stdio.h>

int tmp[16][16];
int ans = 256;

void var(int* x) {
	(*x) = (*x == 0) ? 1 : 0;
	return;
}

void change(int all[16][16], int n, int m, int i, int j) {
	var(&all[i][j]);
	if (i >= 1) var(&all[i - 1][j]);
	if (j >= 1) var(&all[i][j - 1]);
	if (i <= n - 2) var(&all[i + 1][j]);
	if (j <= m - 2) var(&all[i][j + 1]);
}

void getall(int all[16][16], int n, int m) {
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			tmp[i][j] = all[i][j];
		}
	}
}

int try(int all[16][16], int n, int m) {
	getall(all, n, m);
	int cnt = 0;
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++) {
		for (j = 0; j < m; j++) {
			if (tmp[i][j] == 1) {
				cnt++;
				change(tmp, n, m, i + 1, j);
			}
		}
	}
	for (j = 0; j < m; j++) {
		if (tmp[i][j] == 1)return -1;
	}
	return cnt;
}
void dfs(int all[16][16], int step, int cnt, int n, int m) {
	if (step == m) {
		int tmpans = try(all, n, m);
		if (tmpans == -1) return;
		else if (tmpans + cnt > ans)
			ans = tmpans + cnt;
	}
	change(tmp, n, m, 0, step);
	dfs(all, step + 1, cnt + 1, n, m);
	change(tmp, n, m, 0, step);
	dfs(all, step + 1, cnt, n, m);
}

int main() {
	int n = 0;
	int m = 0;
	int i = 0;
	int j = 0;
	int all[16][16];
	scanf("%d %d", &n, &m);
	for (i = 0; i < n; i++) {
		getchar();
		for (j = 0; j < m; j++)
			scanf("%c", &all[i][j]);
	}
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++)
			all[i][j] -= '0';
	}
	dfs(all, 0, 0, n, m);
	printf("%d\n", ans);

	return 0;
}